package modelo;

import java.io.Serializable;
import java.util.Vector;

public abstract class Cuenta implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = -9017837975331606726L;

	private int numero;
	private float saldo;
	private boolean estado;
	private Vector<Movimiento> movimientos;
	private static int proximoNroCta;
	private Cliente cliente;

	public Cuenta(Cliente cliente) {
		this.cliente = cliente;
		numero = getProximoNroCta();
		saldo = 0;
		estado = true;
		movimientos = new Vector<Movimiento>();

	}

	private static int getProximoNroCta() {
		return ++proximoNroCta;
	}

	public int getNumero() {
		return numero;
	}

	public void setNumero(int numero) {
		this.numero = numero;
	}

	public float getSaldo() {
		return saldo;
	}

	public void setSaldo(float saldo) {
		this.saldo = saldo;
	}

	public boolean isEstado() {
		return estado;
	}

	public void setEstado(boolean estado) {
		this.estado = estado;
	}

	public Vector<Movimiento> getMovimientos() {
		return movimientos;
	}

	public void setMovimientos(Vector<Movimiento> movimientos) {
		this.movimientos = movimientos;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public void crearDeposito(float monto) {
		Movimiento mov = new Movimiento(monto, "Deposito");
		movimientos.add(mov);
		saldo = saldo + monto;
	}

	public boolean tenesElNro(int nroCta) {
		return numero == nroCta;
	}

	public CuentaView getView() {
		return new CuentaView(numero, saldo, estado, cliente.crearVista());
	}

	public Vector<MovimientoView> getMovimientosCtaView() {
		Vector<MovimientoView> movs = new Vector<MovimientoView>();
		for (int i = 0; i < movimientos.size(); i++) {
			movs.add(movimientos.elementAt(i).getView());
		}
		return movs;
	}

	public abstract boolean sePuedeExtraer(float monto);

	public float extraer(float monto) {
		Movimiento mov = new Movimiento(monto, "Extraccion");
		movimientos.add(mov);
		saldo = saldo - monto;
		return saldo;
	}
}